/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "工作区.h"


#include "A_引擎/引擎.h"
#include "ui节点面板.h"
#include "ui节点视口.h"
#include "时间轴视口/曲线视口工作区.h"
#include "时间轴视口/轴视口工作区.h"
#include "表格视口/表格工作区.h"
#include "2D视口/2D视口工作区.h"




static void f_工作区布局(C_Widget* self, C_Widget** w, uint32 num) {
	C_工作区页面* 工作区 = dynamic_cast<C_工作区页面*>(self);

	float32 h = self->m_Size.y - w[2]->m_Size.y;

	//页面
	w[0]->f_setPos({ 0,0 });
	w[0]->f_setSize({ self->m_Size.x, h });

	//属性栏
	w[1]->f_setPos({ 0, 0 });
	w[1]->f_setH(self->m_Size.y - w[2]->m_Size.y);

	//状态条
	w[2]->f_setPos({ 0, h });
	w[2]->f_setW(self->m_Size.x);
	
}



static void on_状态栏Draw(C_Widget* self, S_2D画布* 画布) {
	C_工作区_工具条* 属性面板 = dynamic_cast<C_工作区_工具条*>(self);
	
	属性面板->m_背景绘制.m_属性 = f_vg_gen属性(画布);
	S_凸边图元 图元{};
	图元.属性 = f_vg_get属性(画布, 属性面板->m_背景绘制.m_属性);
	属性面板->m_背景绘制.f_Draw(画布, 图元, E_笔刷类型::e_单色填充);
}

static void on_状态条变换修改(C_Widget* self) {
	C_工作区_工具条* 属性面板 = dynamic_cast<C_工作区_工具条*>(self);
	
	属性面板->m_背景绘制.f_alloc(1);
	mat3X2 mat;
	mat.row0 = {};
	mat.row1 = self->m_Size;
	mat.row2 = {S_UI主题::ui_面板圆角半径, 0};
	属性面板->m_背景绘制.f_set单色填充(0, mat, S_UI主题::uic_深灰, S_Widget预设图元::m_下圆角矩形);

}


C_工作区_工具条::C_工作区_工具条(S_UI创建环境& ctx) : C_Widget(&ctx) {
	f_setSize({ 24, 24 });

	mf_DrawFun = on_状态栏Draw;
	mf_变换修改 = on_状态条变换修改;
	
}






static void on_工作区Draw(C_Widget* self, S_2D画布* 画布) {
	C_工作区页面* 属性面板 = dynamic_cast<C_工作区页面*>(self);
	
	属性面板->m_背景绘制.m_属性 = f_vg_gen属性(画布);
	S_凸边图元 图元{};
	图元.属性 = f_vg_get属性(画布, 属性面板->m_背景绘制.m_属性);
	属性面板->m_背景绘制.f_Draw(画布, 图元, E_笔刷类型::e_单色填充);
}

static void on_工作区变换修改(C_Widget* self) {
	C_工作区页面* 属性面板 = dynamic_cast<C_工作区页面*>(self);
	
	属性面板->m_背景绘制.f_alloc(1);
	mat3X2 mat;
	mat.row0 = {};
	mat.row1 = self->m_Size;
	mat.row2 = { S_UI主题::ui_面板圆角半径, 0};
	属性面板->m_背景绘制.f_set单色填充(0, mat, S_主题颜色::uic_工作区背景, S_Widget预设图元::m_下圆角矩形);

}



//
C_工作区页面::C_工作区页面(E_工作区类型 类型, S_UI创建环境& ctx, E_方向 方向, C_Widget* 默认页面, C_状态条* 状态条, C_属性栏* 属性栏) : C_Widget(&ctx), m_工作区类型(类型) {
	m_TypeName = "工作区页面";
	mui_画布页面 = 默认页面;
	m_是否延展 = { true, true };
	m_状态条 = 状态条;
	m_属性栏 = 属性栏;

	mf_布局Fun = f_工作区布局;
	mf_DrawFun = on_工作区Draw;
	mf_变换修改 = on_工作区变换修改;
	//std::vector<C_Widget*> ws = { 默认页面 };
	//auto* 多页面窗口 = f_ui_创建多页面(ctx, 方向, ws);
	/*if (方向 == E_方向::e_横向) {
		f_ui_设置多页面头(多页面窗口, { 60, 20 });
	}
	else {
		f_ui_设置多页面头(多页面窗口, { 20, 20 });
	}*/

	f_添加子组件(默认页面);

	if (nullptr == m_属性栏) {
		m_属性栏 = new C_属性栏(ctx);
		m_属性栏->f_设置宽度(20);
		f_添加子组件(m_属性栏);
	}
	else {
		f_添加子组件(m_属性栏);
	}



	if (nullptr == 状态条) {
		f_添加子组件( new C_工作区_工具条(ctx));
	}
	else {
		f_添加子组件(状态条);
	}
	
}

uint16 C_工作区页面::f_add工作区页面(C_Widget* page, std::string name, std::string ico) {
	return uint16();
}

void C_工作区页面::f_del工作区页面(uint16 id) {

}




//void f_工作区_addWidget(C_Widget* w, C_Widget* page) {
	//auto* 滚动窗口 = f_创建滚动窗口(ctx, 横向滚动条, 纵向滚动条, page);
//	f_ui_多页面添加页面(w, page);
//}

C_Widget* f_工作区_get页面(C_Widget* 工作区, uint16 id) {
	return f_ui_get选项夹页面(工作区, id);
}





static C_工作区页面* g_文本编辑器 = nullptr;
static fp_工作区联动更新 g_文本编辑器fu = nullptr;


void f_页面_绑定工作区更新回调(E_工作区类型 工作区类型, fp_工作区联动更新 函数指针, C_工作区页面* 工作区) {
	switch (工作区类型)
	{
	case e_3D视口:
		break;
	case e_视频纹理:
		break;
	case e_时间轴:
		break;
	case e_节点视口:
		break;
	case e_文本编辑视口:
		g_文本编辑器fu = 函数指针;
		g_文本编辑器 = 工作区;
		break;
	default:
		break;
	}
	
}

void f_页面_更新联动工作区(E_工作区类型 工作区类型) {
	std::vector<C_节点基类*> 节点;
	if (f_prop_Bool(S_节点数据状态::g_打开编辑模式)) {
		auto obs = f_global_get编辑拾取物体();
		for (auto& ob : obs) {
			auto 拾取的物体 = f_NodeCtx_从可视物体取节点({ ob.物体 });
			节点.insert(节点.end(), 拾取的物体.begin(), 拾取的物体.end());
		}
	}
	else {
		节点 = f_NodeCtx_从可视物体取节点(S_节点数据::g_选中激活物体);
	}

	switch (工作区类型) {
	case e_3D视口: {
		C_节点面板* 钉住节点面板 = f_global_get钉住节点();
		if (钉住节点面板) {

		}
		else {
			/*for (auto* plane : 节点) {
				for (auto& w : plane->m_UI部件) {
					C_节点面板* 节点面板 = static_cast<C_节点面板*>(w);
					if (节点面板->m_是否已弃用 == false) {
						//C_节点视口* view = (C_节点视口*)(节点面板->m_节点当前所在视口);
						//节点面板->m_属性面板参数构建(view->m_属性栏, (S_结构对象指针)节点面板);
						//f_NodeView_清除激活节点(view);
					}
				}
			}*/
			//f_global_set激活节点(节点);
			//f_NodeView_设置节点视口激活节点(节点);
			//f_曲线视口工作区_设置当前编辑节点();
			f_曲线视口工作区_设置当前编辑物体();
		}
		
		
		f_2D编辑视口页面_联动更新();
		break;
	}
	case e_2D视口: {
		f_2D编辑视口页面_联动更新();
		break;
	}
	case E_工作区类型::e_曲线视口: {
		//auto& nodes = f_global_get激活节点();
		f_时间轴页面_联动更新();
		f_表格视口页面_联动更新();
		f_2D编辑视口页面_联动更新();
		break;
	}
	case e_视频纹理:
		break;
	
	case e_时间轴:
		f_曲线视口页面_联动更新();
		f_表格视口页面_联动更新();
		break;
	case e_节点视口:
		g_文本编辑器fu(g_文本编辑器);
		f_曲线视口工作区_设置当前编辑节点();
		f_表格视口页面_设置当前节点数据();
		break;
	case e_文本编辑视口:
		break;

	case E_工作区类型::e_表格视口:
		
		break;
	default:
		break;
	}
}






